This workbook includes: 1. Creating a Seurat object from CellRanger output. 2. Preparing and cleaning the data a) Visualize QC b) Filter out unwanted cells c) Identify and remove doublets d) Normalization and scale e) Select Variable features 3. Merging and Harmonizing samples a) Merge samples b) Use Seurat find anchors to integrate c) Compare merged vs integrated 4. Dimensional reduction clustering and visualization a) PCA and component selection b) UMAP c) Clustering and visualization 5. Cluster annotation a) Visualize expression of known cell type markers b) Find cluster markers and look them up in reference cell type library c) Manual cluster annotation d) Decisions on merging clusters 6. Automated cluster annotation a) Seurat label transfer b) scClassify
We will use data from iPSC derived midbrain organoids There are two samples from dissociated midbrain organoids 1) iPSC line from a patient with Parkinson’s Disease carrying a triplication of the gene SNCA 2) The same iPSC line CRISPR corrected to make an isogenenic control
Load your required libraries. You need to have these libraries already installed.
library("scClassify")
library(SingleCellExperiment)
Warning: package ‘SingleCellExperiment’ was built under R version 4.2.2
Loading required package: SummarizedExperiment
Loading required package: MatrixGenerics
Loading required package: matrixStats
Attaching package: ‘matrixStats’
The following object is masked from ‘package:dplyr’:
count
Attaching package: ‘MatrixGenerics’
The following objects are masked from ‘package:matrixStats’:
colAlls, colAnyNAs, colAnys, colAvgsPerRowSet,
colCollapse, colCounts, colCummaxs, colCummins,
colCumprods, colCumsums, colDiffs, colIQRDiffs, colIQRs,
colLogSumExps, colMadDiffs, colMads, colMaxs, colMeans2,
colMedians, colMins, colOrderStats, colProds,
colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
colSums2, colTabulates, colVarDiffs, colVars,
colWeightedMads, colWeightedMeans, colWeightedMedians,
colWeightedSds, colWeightedVars, rowAlls, rowAnyNAs,
rowAnys, rowAvgsPerColSet, rowCollapse, rowCounts,
rowCummaxs, rowCummins, rowCumprods, rowCumsums,
rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians,
rowMins, rowOrderStats, rowProds, rowQuantiles,
rowRanges, rowRanks, rowSdDiffs, rowSds, rowSums2,
rowTabulates, rowVarDiffs, rowVars, rowWeightedMads,
rowWeightedMeans, rowWeightedMedians, rowWeightedSds,
rowWeightedVars
Loading required package: GenomicRanges
Warning: package ‘GenomicRanges’ was built under R version 4.2.2
Loading required package: stats4
Attaching package: ‘stats4’
The following object is masked from ‘package:spam’:
mle
Loading required package: BiocGenerics
Attaching package: ‘BiocGenerics’
The following objects are masked from ‘package:spam’:
cbind, rbind
The following objects are masked from ‘package:dplyr’:
combine, intersect, setdiff, union
The following objects are masked from ‘package:stats’:
IQR, mad, sd, var, xtabs
The following objects are masked from ‘package:base’:
anyDuplicated, aperm, append, as.data.frame, basename,
cbind, colnames, dirname, do.call, duplicated, eval,
evalq, Filter, Find, get, grep, grepl, intersect,
is.unsorted, lapply, Map, mapply, match, mget, order,
paste, pmax, pmax.int, pmin, pmin.int, Position, rank,
rbind, Reduce, rownames, sapply, setdiff, sort, table,
tapply, union, unique, unsplit, which.max, which.min
Loading required package: S4Vectors
Warning: package ‘S4Vectors’ was built under R version 4.2.2
Attaching package: ‘S4Vectors’
The following objects are masked from ‘package:dplyr’:
first, rename
The following object is masked from ‘package:tidyr’:
expand
The following objects are masked from ‘package:base’:
expand.grid, I, unname
Loading required package: IRanges
Attaching package: ‘IRanges’
The following objects are masked from ‘package:dplyr’:
collapse, desc, slice
The following object is masked from ‘package:purrr’:
reduce
Loading required package: GenomeInfoDb
Warning: package ‘GenomeInfoDb’ was built under R version 4.2.2
Loading required package: Biobase
Welcome to Bioconductor
Vignettes contain introductory material; view with
'browseVignettes()'. To cite Bioconductor, see
'citation("Biobase")', and for packages
'citation("pkgname")'.
Attaching package: ‘Biobase’
The following object is masked from ‘package:MatrixGenerics’:
rowMedians
The following objects are masked from ‘package:matrixStats’:
anyMissing, rowMedians
Attaching package: ‘SummarizedExperiment’
The following object is masked from ‘package:SeuratObject’:
Assays
The following object is masked from ‘package:Seurat’:
Assays
library("Matrix")
Attaching package: ‘Matrix’
The following object is masked from ‘package:S4Vectors’:
expand
The following object is masked from ‘package:spam’:
det
The following objects are masked from ‘package:tidyr’:
expand, pack, unpack
Load the data: Starting with the control data.
# load data
# read in the data - CellRanger output - barcodes, features, expression matrix
# you need to enter the file path to the folder with the three files
con_data <- Read10X("/Users/rhalenathomas/Documents/Data/scRNAseq/AST23_BrainComm/CellRangerOuts/AST23isogenic/raw_feature_bc_matrix")
#Look at the dimensions of the matrix
dim(con_data)
[1] 33538 6794880
#Look at a small part of the data
con_data[1:5, 1:5]
5 x 5 sparse Matrix of class "dgCMatrix"
AAACCCAAGAAACACT-1 AAACCCAAGAAACCAT-1 AAACCCAAGAAACCCA-1
MIR1302-2HG . . .
FAM138A . . .
OR4F5 . . .
AL627309.1 . . .
AL627309.3 . . .
AAACCCAAGAAACCCG-1 AAACCCAAGAAACCTG-1
MIR1302-2HG . .
FAM138A . .
OR4F5 . .
AL627309.1 . .
AL627309.3 . .
#Look at the distribution of the number of UMIs per cell
colSums(con_data) %>% summary
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 0.00 0.00 4.48 0.00 58329.00
#Look at the distribution of the number of genes per cell
colSums(con_data > 0) %>% summary
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 0.000 0.000 1.695 0.000 7999.000
Remove barcodes with too few genes that could be empty droplets
#Remove barcodes with less than 100 genes detected (you can select a different value here)
# without
con_data <- con_data[, colSums(con_data > 0)> 100]
dim(con_data)
[1] 33538 3739
Filter genes and create a Seurat object
#We might not want to include genes that occur in few cells are no cells. Here we will filter out genes/transcripts that are in less than 3 cells.
# you don't have to filter any genes you can also change to any filter threshold you want
#Make a Seurat object
#Removing any genes detected in less than 3 cells
# we can also filter cells at this stage too.
con_seu <- CreateSeuratObject(con_data, project = "Control", min.cells = 3)
# look at the object dimensions
con_seu
An object of class Seurat
18557 features across 3739 samples within 1 assay
Active assay: RNA (18557 features, 0 variable features)
Data distribution
# look at the distribution of total counts of RNA across cells
con_seu$nCount_RNA %>% summary
Min. 1st Qu. Median Mean 3rd Qu. Max.
106 2125 6240 7441 10870 58316
# look at the distribution of unique RNA transcripts across cells
con_seu$nFeature_RNA %>% summary
Min. 1st Qu. Median Mean 3rd Qu. Max.
101.0 997.5 2556.0 2433.6 3608.5 7981.0
Visualize the distributions
VlnPlot(con_seu, features = c("nCount_RNA","nFeature_RNA"), pt.size = 0)
Filter out unwanted cells
con_seu$percent.MT %>% summary
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 2.257 4.783 8.075 8.524 94.762
VlnPlot(con_seu, features = "percent.MT", pt.size = 0.001)
Now we will filter some cells with too high mitochondrial RNA Filter out cells with too many RNA reads - these are likely doublets
#Remove any cells with more than 20% mitochondrial counts
con_seu.ft <- subset(con_seu, percent.MT < 20)
#Remove cells with very high UMI counts, which may be possible multiplets
con_seu.ft <- subset(con_seu.ft, nCount_RNA < 20000)
# see the results
VlnPlot(con_seu, features = c("percent.MT", "nCount_RNA", "nFeature_RNA"), pt.size = 0.001)
# check how many cells we have
con_seu.ft
An object of class Seurat
18557 features across 3219 samples within 1 assay
Active assay: RNA (18557 features, 0 variable features)
We might want to filter more cells with low total and/or unique RNA
con_seu
An object of class Seurat
18557 features across 3219 samples within 1 assay
Active assay: RNA (18557 features, 0 variable features)
Apply final filtering conditions
dim(con_seu_ft)
[1] 18557 2938
Clear extra data object we don’t need anymore
rm(con_data,con_seu.ft)
Normalizing
# Normalize data (log normalization) and select genes with variable expression across cells --------------------------------------
con_seu_ft <- NormalizeData(con_seu_ft, normalization.method = "vst", scale.factor = 10000)
Error in NormalizeData.default(object = GetAssayData(object = object, :
Unknown normalization method: vst
Finding Variable features
VariableFeaturePlot(con_seu_ft)
var[1:10]
[1] "DLK1" "TTR" "CRYAB" "TAC1" "TPH1" "CENPF"
[7] "ANXA1" "LDHA" "GDF15" "TFPI2"
Dimensionality reduction PCA and UMAP
We won’t run this code I’ve included this analysis that calculates the cut-off for signicance of component numbers. However the function runs multiple iterations of the PCA and will take a long time to run.
# Jackstraw
#Assess how many PCs capture most of the information in the data
seu <-JackStraw(seu, reduction = "pca",
dims = 30)
seu <- ScoreJackStraw(seu, reduction = "pca", dims = 1:30)
JackStrawPlot(seu, dims = 1:30)
Non-linear dimensional reduction using UMAP
#Non-linear dimensionality reduction
#Choosing how many PCs to input can depend on the elbow plot and on the number of cells
#There are many parameters that can e tweaked and optimized in a UMAP plot
#You can see some demos here: https://pair-code.github.io/understanding-umap/
con_seu_ft <- RunUMAP(con_seu_ft, dims = 1:18)
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session
21:40:57 UMAP embedding parameters a = 0.9922 b = 1.112
21:40:57 Read 2938 rows and found 18 numeric columns
21:40:57 Using Annoy for neighbor search, n_neighbors = 30
21:40:57 Building Annoy index with metric = cosine, n_trees = 50
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
21:40:57 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpnG1dt1/file27ca605ea146
21:40:57 Searching Annoy index using 1 thread, search_k = 3000
21:40:57 Annoy recall = 100%
21:40:58 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
21:40:58 Initializing from normalized Laplacian + noise (using irlba)
21:40:58 Commencing optimization for 500 epochs, with 116704 positive edges
Using method 'umap'
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
21:41:03 Optimization finished
UMAPPlot(con_seu_ft)
NA
NA
Doublet identification
bcmvn_con <- find.pK(sweep.stats_con)
NULL
ggplot(bcmvn_con, aes(x = pK, y = BCmetric, group = "Sweep")) + geom_point() + geom_line() +
theme(axis.text.x = element_text(angle = 90))
nExp_poi <- round(0.025*nrow(con_seu_ft@meta.data))
con_seu_ft <- doubletFinder_v3(con_seu_ft, PCs = 1:18, pN = 0.25, pK = 0.08, nExp = nExp_poi, reuse.pANN = FALSE, sct = FALSE)
[1] "Creating 979 artificial doublets..."
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix
|
| | 0%
|
|======================== | 50%
|
|===============================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Computing pANN..."
[1] "Classifying doublets.."
#Here we update the Seurat object version just in case the one returned by DoubletFinder is an older version
con_seu_ft <- UpdateSeuratObject(con_seu_ft)
Validating object structure
Updating object slots
Ensuring keys are in the proper structure
Ensuring feature names don't have underscores or pipes
Object representation is consistent with the most current Seurat version
Visualize the doublet removal results
# we need to look in the data object
#Visualize and assess the cells called as probable doublets
UMAPPlot(con_seu_ft, group.by = "DF.classifications_0.25_0.08_73")
# table of doublets and signlets
con_seu_ft$DF.classifications_0.25_0.08_73 %>% table
.
Doublet Singlet
73 2865
# visualize the features in doublets and singlets
VlnPlot(con_seu_ft, features = c("nCount_RNA", "nFeature_RNA", "percent.MT", "pANN_0.25_0.08_73"),
group.by = "DF.classifications_0.25_0.08_73", pt.size = 0.001, ncol = 2, log = TRUE)
dim(con_seu_ft)
[1] 18557 2938
dim(con_seu_ft2)
[1] 18557 2865
Repeat the above steps for the SNCA triplication patient line
# read in data
ast_data <- Read10X("/Users/rhalenathomas/Documents/Data/scRNAseq/AST23_BrainComm/CellRangerOuts/AST23/raw_feature_bc_matrix")
# create seurat object
# filter object with the same settings as with the control
# PCA analysis
# Remove doublets
# clean up
rm(ast_data,ast_seu_ft,bcmvn_ast,bcmvn_con,con_seu_ft, sweep.res.ast, sweep.res.con, sweep.stats_ast, sweep.stats_con)
Merge data objects
merge_seurat <- merge(con_seu_ft2,ast_seu_ft2)
Warning in CheckDuplicateCellNames(object.list = objects) :
Some cell names are duplicated across objects provided. Renaming to enforce unique cell names.
merge_seurat
An object of class Seurat
19204 features across 4028 samples within 1 assay
Active assay: RNA (19204 features, 0 variable features)
unique(merge_seurat$orig.ident)
[1] "Control" "SNCA"
Find anchors between the two data objects
sample.list <- SplitObject(merge_seurat, split.by = "orig.ident")
# We have already normalized and identified variable features in each sample
# If we had not done so we can normalize here
#for (i in 1:length(sample.list)){
# org.list[[i]] <- NormalizeData(org.list[[i]], verbose = FALSE)
#org.list[[i]] <- FindVariableFeatures(org.list[[i]], selection.method = "vst")
#}
# Now we find features that can act as anchors between the two samples
int.anchors <- FindIntegrationAnchors(object.list = sample.list, dims = 1:50)
Computing 2000 integration features
No variable features found for object1 in the object.list. Running FindVariableFeatures ...
Calculating gene variances
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
No variable features found for object2 in the object.list. Running FindVariableFeatures ...
Calculating gene variances
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Scaling features for provided objects
| | 0 % ~calculating
|+++++++++++++++++++++++++ | 50% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s
Finding all pairwise anchors
| | 0 % ~calculating
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
Found 4320 anchors
Filtering anchors
Retained 3529 anchors
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=16s
integrated_seurat <- IntegrateData(anchorset = int.anchors, dims = 1:50)
Merging dataset 2 into 1
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Optional: save the integrated object or read in the Integrated object for the next step.
# remove # comment from the code you want to run
saveRDS(integrated_seurat,"IntegratedSeurat.RDS")
#integrated_seurate <- readRDS("IntegratedSeurat.RDS")
PCA and UMAP on the merged object
# merged object
DefaultAssay(merge_seurat) <- "RNA"
merge_seurat <- ScaleData(merge_seurat, verbose = FALSE)
# in the merge data set we sill need features for the PCA input
merge_seurat <- FindVariableFeatures(merge_seurat, selection.method = "vst")
Calculating gene variances
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
merge_seurat <- RunPCA(merge_seurat, npcs = 30, verbose = FALSE)
merge_seurat <- RunUMAP(merge_seurat, reduction = "pca", dims = 1:30)
09:45:55 UMAP embedding parameters a = 0.9922 b = 1.112
09:45:55 Read 4028 rows and found 30 numeric columns
09:45:55 Using Annoy for neighbor search, n_neighbors = 30
09:45:55 Building Annoy index with metric = cosine, n_trees = 50
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
09:45:56 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpnG1dt1/file27ca2b429337
09:45:56 Searching Annoy index using 1 thread, search_k = 3000
09:45:56 Annoy recall = 100%
09:45:57 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
09:45:57 Initializing from normalized Laplacian + noise (using irlba)
09:45:57 Commencing optimization for 500 epochs, with 163142 positive edges
Using method 'umap'
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
09:46:04 Optimization finished
Repeat PCA and UMAP for the integrated object
Idents(integrated_seurat) <- "integrated"
integrated_seurat <- ScaleData(integrated_seurat, verbose = FALSE)
# only the integrated features will be the pca input
integrated_seurat <- RunPCA(integrated_seurat, npcs = 30, verbose = FALSE)
integrated_seurat <- RunUMAP(integrated_seurat, reduction = "pca", dims = 1:30)
09:41:56 UMAP embedding parameters a = 0.9922 b = 1.112
09:41:56 Read 4028 rows and found 30 numeric columns
09:41:56 Using Annoy for neighbor search, n_neighbors = 30
09:41:56 Building Annoy index with metric = cosine, n_trees = 50
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
09:41:56 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpnG1dt1/file27ca184449b3
09:41:56 Searching Annoy index using 1 thread, search_k = 3000
09:41:57 Annoy recall = 100%
09:41:57 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
09:41:58 Initializing from normalized Laplacian + noise (using irlba)
09:41:58 Commencing optimization for 500 epochs, with 165954 positive edges
Using method 'umap'
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
09:42:04 Optimization finished
Optional: save the PCA and UMAP integrated object or read in the saved object
# remove # comment from the code you want to run
saveRDS(integrated_seurat,"IntegratedSeuratGraphs.RDS")
#integrated_seurat <- readRDS("IntegratedSeuratGraphs.RDS")
Let’s look at the UMAPs from the merged vs the integrated data
p1 <- DimPlot(merge_seurat, group.by = "orig.ident") + ggtitle("Merge")
p2 <- DimPlot(integrated_seurat, group.by = "orig.ident") + ggtitle("Integrated")
p1
p2
We see almost no difference in this data. This is not the case in all data sets
Cluster the integrated data
# see the importance of the pca components
ElbowPlot(integrated_seurat, ndims=30)
integrated_seurat
An object of class Seurat
21204 features across 4028 samples within 2 assays
Active assay: integrated (2000 features, 2000 variable features)
1 other assay present: RNA
2 dimensional reductions calculated: pca, umap
dim(integrated_seurat)
[1] 2000 4028
We will choose 20 PCs There are 4028 cells. A common rule of thumb for choosing k for nearest neighbours is using the square root of the number of cells = 63
Visualize the UMAP of the different cluster resolutions
res <- c(0.05,0.25,0.4,0.5,0.6,1,1.5)
resolutions <- paste("integrated_snn_res.", res, sep="")
resolutions
[1] "integrated_snn_res.0.05" "integrated_snn_res.0.25"
[3] "integrated_snn_res.0.4" "integrated_snn_res.0.5"
[5] "integrated_snn_res.0.6" "integrated_snn_res.1"
[7] "integrated_snn_res.1.5"
for(r in resolutions){
print(DimPlot(integrated_seurat, group.by = r))
}
NA
NA
Now we need to choose a resolution to annotate. I will select resolution of 0.6.
# Scale the total RNA
# before we only scaled the integrated expression for the genes used for integration
# now we want to scale all genes
DefaultAssay(integrated_seurat) <- "RNA"
integrated_seurat <- ScaleData(integrated_seurat)
Centering and scaling data matrix
|
| | 0%
|
|=== | 5%
|
|====== | 10%
|
|========= | 15%
|
|============ | 20%
|
|============== | 25%
|
|================= | 30%
|
|==================== | 35%
|
|======================= | 40%
|
|========================== | 45%
|
|============================= | 50%
|
|================================ | 55%
|
|=================================== | 60%
|
|====================================== | 65%
|
|========================================= | 70%
|
|============================================ | 75%
|
|============================================== | 80%
|
|================================================= | 85%
|
|==================================================== | 90%
|
|======================================================= | 95%
|
|==========================================================| 100%
Look at known cell type markers
# features list from literature
da_neurons <- c("TH","SLC6A3","SLC18A2","SOX6","NDNF","SNCG","ALDH1A1","CALB1","TACR2","SLC17A6","SLC32A1","OTX2","GRP","LPL","CCK","VIP")
NPC_orStemLike <- c("DCX","NEUROD1","TBR1","PCNA","MKI67","SOX2","NES","PAX6","MASH1")
mature_neurons = c("RBFOX3","SYP","DLG45","VAMP1","VAMP2","TUBB3","SYT1","BSN","HOMER1","SLC17A6")
excitatory_neurons = c("GRIA2","GRIA1","GRIA4","GRIN1","GRIN2B","GRIN2A","GRIN3A","GRIN3","GRIP1","CAMK2A")
inhbitory_neurons = inh = c("GAD1","GAD2", "GAT1","PVALB","GABR2","GABR1","GBRR1","GABRB2","GABRB1","GABRB3","GABRA6","GABRA1","GABRA4","TRAK2")
astrocytes <- c("GFAP","S100B","AQP4","APOE", "SOX9")
oligodendrocytes <- c("MBP","MOG","OLIG1","OLIG2","SOX10")
opc <-
radial_glia <- c("PTPRC","AIF1","ADGRE1", "VIM", "TNC","PTPRZ1","FAM107A","HOPX","LIFR",
"ITGB5","IL6ST")
endothelial <-
epithelial <- c("HES1","HES5","SOX2","SOX10","NES","CDH1","NOTCH1")
microglia <- c("IBA1","P2RY12","P2RY13","TREM119", "GPR34","SIGLECH","TREM2",
"CX3CR1","FCRLS","OLFML3","HEXB","TGFBR1", "SALL1","MERTK",
"PROS1")
features <- c("MKI67","SOX2","POU5F1","DLX2","PAX6","SOX9","HES1","NES","RBFOX3","MAP2","NCAM1","CD24","GRIA2","GRIN2B","GABBR1","GAD1","GAD2","GABRA1","GABRB2","TH","ALDH1A1","LMX1B","NR4A2","CORIN","CALB1","KCNJ6","CXCR4","ITGA6","SLC1A3","CD44","AQP4","S100B", "PDGFRA","OLIG2","MBP","CLDN11","VIM","VCAM1")
Seurat has several helpful plotting function that use ggplot
# we set the active identity of the meta data to be the clusters at the resolution we want to label
Idents(integrated_seurat) <- "integrated_snn_res.0.6"
FeaturePlot(integrated_seurat, label = TRUE, features = short_list)
Warning: Could not find RBFOX3 in the default search locations, found in RNA assay instead
Warning: Could not find MAP2 in the default search locations, found in RNA assay instead
Warning: Could not find TH in the default search locations, found in RNA assay instead
Warning: Could not find MBP in the default search locations, found in RNA assay instead
# this will let us see one at at time
for (i in short_list) {
print(FeaturePlot(integrated_seurat, features = i, min.cutoff = 'q1', max.cutoff = 'q97', label = TRUE))
}
NA
NA
Now that we see the TH is all in one spot that is part of a large cluster we look back at the different cluster level.
# look at the Feature plots with the cluster resolution 1
Dot Plots
DotPlot(integrated_seurat, group.by = "integrated_snn_res.1",
features = short_list, assay = "RNA") + RotatedAxis()
DotPlot(integrated_seurat, group.by = "integrated_snn_res.1",
features = da_neurons, assay = "RNA") + RotatedAxis()
Warning in FetchData.Seurat(object = object, vars = features, cells = cells) :
The following requested variables were not found: SLC6A3, TACR2, VIP
DotPlot(integrated_seurat, group.by = "integrated_snn_res.1",
features = mature_neurons, assay = "RNA") + RotatedAxis()
Warning in FetchData.Seurat(object = object, vars = features, cells = cells) :
The following requested variables were not found: DLG45
Heatmaps
DoHeatmap(integrated_seurat, group.by = "integrated_snn_res.1",
features = short_list, slot = "scale.data")
Look at more expression lists
Find Cluster markers
# cluster markers will be calculated for the active identity
Idents(integrated_seurat) <- "integrated_snn_res.1"
ClusterMarkers <- FindAllMarkers(integrated_seurat, only.pos = TRUE)
Calculating cluster 0
| | 0 % ~calculating
|+ | 1 % ~15s
|++ | 2 % ~15s
|++ | 3 % ~15s
|+++ | 4 % ~14s
|+++ | 5 % ~14s
|++++ | 6 % ~13s
|++++ | 8 % ~13s
|+++++ | 9 % ~13s
|+++++ | 10% ~13s
|++++++ | 11% ~12s
|++++++ | 12% ~12s
|+++++++ | 13% ~12s
|+++++++ | 14% ~12s
|++++++++ | 15% ~12s
|+++++++++ | 16% ~12s
|+++++++++ | 17% ~11s
|++++++++++ | 18% ~11s
|++++++++++ | 19% ~11s
|+++++++++++ | 20% ~11s
|+++++++++++ | 22% ~11s
|++++++++++++ | 23% ~11s
|++++++++++++ | 24% ~10s
|+++++++++++++ | 25% ~10s
|+++++++++++++ | 26% ~10s
|++++++++++++++ | 27% ~10s
|++++++++++++++ | 28% ~10s
|+++++++++++++++ | 29% ~10s
|++++++++++++++++ | 30% ~09s
|++++++++++++++++ | 31% ~09s
|+++++++++++++++++ | 32% ~09s
|+++++++++++++++++ | 33% ~09s
|++++++++++++++++++ | 34% ~09s
|++++++++++++++++++ | 35% ~09s
|+++++++++++++++++++ | 37% ~09s
|+++++++++++++++++++ | 38% ~08s
|++++++++++++++++++++ | 39% ~08s
|++++++++++++++++++++ | 40% ~08s
|+++++++++++++++++++++ | 41% ~08s
|+++++++++++++++++++++ | 42% ~08s
|++++++++++++++++++++++ | 43% ~08s
|+++++++++++++++++++++++ | 44% ~08s
|+++++++++++++++++++++++ | 45% ~08s
|++++++++++++++++++++++++ | 46% ~07s
|++++++++++++++++++++++++ | 47% ~07s
|+++++++++++++++++++++++++ | 48% ~07s
|+++++++++++++++++++++++++ | 49% ~07s
|++++++++++++++++++++++++++ | 51% ~07s
|++++++++++++++++++++++++++ | 52% ~07s
|+++++++++++++++++++++++++++ | 53% ~07s
|+++++++++++++++++++++++++++ | 54% ~06s
|++++++++++++++++++++++++++++ | 55% ~06s
|++++++++++++++++++++++++++++ | 56% ~06s
|+++++++++++++++++++++++++++++ | 57% ~06s
|++++++++++++++++++++++++++++++ | 58% ~06s
|++++++++++++++++++++++++++++++ | 59% ~06s
|+++++++++++++++++++++++++++++++ | 60% ~06s
|+++++++++++++++++++++++++++++++ | 61% ~05s
|++++++++++++++++++++++++++++++++ | 62% ~05s
|++++++++++++++++++++++++++++++++ | 63% ~05s
|+++++++++++++++++++++++++++++++++ | 65% ~05s
|+++++++++++++++++++++++++++++++++ | 66% ~05s
|++++++++++++++++++++++++++++++++++ | 67% ~05s
|++++++++++++++++++++++++++++++++++ | 68% ~05s
|+++++++++++++++++++++++++++++++++++ | 69% ~04s
|+++++++++++++++++++++++++++++++++++ | 70% ~04s
|++++++++++++++++++++++++++++++++++++ | 71% ~04s
|+++++++++++++++++++++++++++++++++++++ | 72% ~04s
|+++++++++++++++++++++++++++++++++++++ | 73% ~04s
|++++++++++++++++++++++++++++++++++++++ | 74% ~04s
|++++++++++++++++++++++++++++++++++++++ | 75% ~03s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~03s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~03s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~03s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~03s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~03s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~03s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~02s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~02s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~02s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~02s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=14s
Calculating cluster 1
| | 0 % ~calculating
|+ | 1 % ~11s
|++ | 2 % ~10s
|++ | 3 % ~10s
|+++ | 4 % ~10s
|+++ | 5 % ~10s
|++++ | 7 % ~10s
|++++ | 8 % ~10s
|+++++ | 9 % ~09s
|+++++ | 10% ~09s
|++++++ | 11% ~09s
|+++++++ | 12% ~09s
|+++++++ | 13% ~09s
|++++++++ | 14% ~09s
|++++++++ | 15% ~09s
|+++++++++ | 16% ~09s
|+++++++++ | 18% ~09s
|++++++++++ | 19% ~09s
|++++++++++ | 20% ~08s
|+++++++++++ | 21% ~08s
|+++++++++++ | 22% ~08s
|++++++++++++ | 23% ~08s
|+++++++++++++ | 24% ~08s
|+++++++++++++ | 25% ~08s
|++++++++++++++ | 26% ~08s
|++++++++++++++ | 27% ~08s
|+++++++++++++++ | 29% ~07s
|+++++++++++++++ | 30% ~07s
|++++++++++++++++ | 31% ~07s
|++++++++++++++++ | 32% ~07s
|+++++++++++++++++ | 33% ~07s
|++++++++++++++++++ | 34% ~07s
|++++++++++++++++++ | 35% ~07s
|+++++++++++++++++++ | 36% ~07s
|+++++++++++++++++++ | 37% ~07s
|++++++++++++++++++++ | 38% ~06s
|++++++++++++++++++++ | 40% ~06s
|+++++++++++++++++++++ | 41% ~06s
|+++++++++++++++++++++ | 42% ~06s
|++++++++++++++++++++++ | 43% ~06s
|++++++++++++++++++++++ | 44% ~06s
|+++++++++++++++++++++++ | 45% ~06s
|++++++++++++++++++++++++ | 46% ~06s
|++++++++++++++++++++++++ | 47% ~05s
|+++++++++++++++++++++++++ | 48% ~05s
|+++++++++++++++++++++++++ | 49% ~05s
|++++++++++++++++++++++++++ | 51% ~05s
|++++++++++++++++++++++++++ | 52% ~05s
|+++++++++++++++++++++++++++ | 53% ~05s
|+++++++++++++++++++++++++++ | 54% ~05s
|++++++++++++++++++++++++++++ | 55% ~05s
|+++++++++++++++++++++++++++++ | 56% ~05s
|+++++++++++++++++++++++++++++ | 57% ~04s
|++++++++++++++++++++++++++++++ | 58% ~04s
|++++++++++++++++++++++++++++++ | 59% ~04s
|+++++++++++++++++++++++++++++++ | 60% ~04s
|+++++++++++++++++++++++++++++++ | 62% ~04s
|++++++++++++++++++++++++++++++++ | 63% ~04s
|++++++++++++++++++++++++++++++++ | 64% ~04s
|+++++++++++++++++++++++++++++++++ | 65% ~04s
|+++++++++++++++++++++++++++++++++ | 66% ~04s
|++++++++++++++++++++++++++++++++++ | 67% ~03s
|+++++++++++++++++++++++++++++++++++ | 68% ~03s
|+++++++++++++++++++++++++++++++++++ | 69% ~03s
|++++++++++++++++++++++++++++++++++++ | 70% ~03s
|++++++++++++++++++++++++++++++++++++ | 71% ~03s
|+++++++++++++++++++++++++++++++++++++ | 73% ~03s
|+++++++++++++++++++++++++++++++++++++ | 74% ~03s
|++++++++++++++++++++++++++++++++++++++ | 75% ~03s
|++++++++++++++++++++++++++++++++++++++ | 76% ~03s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~02s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~02s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~02s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~02s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~02s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~02s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~02s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~02s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=10s
Calculating cluster 2
| | 0 % ~calculating
|+ | 1 % ~07s
|+ | 2 % ~08s
|++ | 3 % ~07s
|++ | 4 % ~07s
|+++ | 5 % ~07s
|+++ | 6 % ~07s
|++++ | 7 % ~07s
|++++ | 8 % ~07s
|+++++ | 9 % ~07s
|+++++ | 10% ~07s
|++++++ | 11% ~06s
|++++++ | 12% ~06s
|+++++++ | 13% ~06s
|+++++++ | 14% ~06s
|++++++++ | 15% ~06s
|++++++++ | 16% ~06s
|+++++++++ | 17% ~06s
|+++++++++ | 18% ~06s
|++++++++++ | 19% ~06s
|++++++++++ | 20% ~06s
|+++++++++++ | 21% ~06s
|+++++++++++ | 22% ~06s
|++++++++++++ | 23% ~06s
|++++++++++++ | 24% ~05s
|+++++++++++++ | 25% ~05s
|+++++++++++++ | 26% ~05s
|++++++++++++++ | 27% ~05s
|++++++++++++++ | 28% ~05s
|+++++++++++++++ | 29% ~05s
|+++++++++++++++ | 30% ~06s
|++++++++++++++++ | 31% ~06s
|++++++++++++++++ | 32% ~06s
|+++++++++++++++++ | 33% ~06s
|+++++++++++++++++ | 34% ~05s
|++++++++++++++++++ | 35% ~05s
|++++++++++++++++++ | 36% ~05s
|+++++++++++++++++++ | 37% ~05s
|+++++++++++++++++++ | 38% ~05s
|++++++++++++++++++++ | 39% ~05s
|++++++++++++++++++++ | 40% ~05s
|+++++++++++++++++++++ | 41% ~05s
|+++++++++++++++++++++ | 42% ~05s
|++++++++++++++++++++++ | 43% ~05s
|++++++++++++++++++++++ | 44% ~04s
|+++++++++++++++++++++++ | 45% ~04s
|+++++++++++++++++++++++ | 46% ~04s
|++++++++++++++++++++++++ | 47% ~04s
|++++++++++++++++++++++++ | 48% ~04s
|+++++++++++++++++++++++++ | 49% ~04s
|+++++++++++++++++++++++++ | 50% ~04s
|++++++++++++++++++++++++++ | 51% ~04s
|++++++++++++++++++++++++++ | 52% ~04s
|+++++++++++++++++++++++++++ | 53% ~04s
|+++++++++++++++++++++++++++ | 54% ~04s
|++++++++++++++++++++++++++++ | 55% ~03s
|++++++++++++++++++++++++++++ | 56% ~03s
|+++++++++++++++++++++++++++++ | 57% ~03s
|+++++++++++++++++++++++++++++ | 58% ~03s
|++++++++++++++++++++++++++++++ | 59% ~03s
|++++++++++++++++++++++++++++++ | 60% ~03s
|+++++++++++++++++++++++++++++++ | 61% ~03s
|+++++++++++++++++++++++++++++++ | 62% ~03s
|++++++++++++++++++++++++++++++++ | 63% ~03s
|++++++++++++++++++++++++++++++++ | 64% ~03s
|+++++++++++++++++++++++++++++++++ | 65% ~03s
|+++++++++++++++++++++++++++++++++ | 66% ~03s
|++++++++++++++++++++++++++++++++++ | 67% ~02s
|++++++++++++++++++++++++++++++++++ | 68% ~02s
|+++++++++++++++++++++++++++++++++++ | 69% ~02s
|+++++++++++++++++++++++++++++++++++ | 70% ~02s
|++++++++++++++++++++++++++++++++++++ | 71% ~02s
|++++++++++++++++++++++++++++++++++++ | 72% ~02s
|+++++++++++++++++++++++++++++++++++++ | 73% ~02s
|+++++++++++++++++++++++++++++++++++++ | 74% ~02s
|++++++++++++++++++++++++++++++++++++++ | 75% ~02s
|++++++++++++++++++++++++++++++++++++++ | 76% ~02s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~02s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~02s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~02s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~01s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~01s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~01s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~01s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=07s
Calculating cluster 3
| | 0 % ~calculating
|+ | 1 % ~19s
|++ | 2 % ~19s
|++ | 3 % ~19s
|+++ | 4 % ~18s
|+++ | 5 % ~18s
|++++ | 6 % ~18s
|++++ | 7 % ~18s
|+++++ | 8 % ~17s
|+++++ | 9 % ~17s
|++++++ | 10% ~17s
|++++++ | 11% ~17s
|+++++++ | 12% ~17s
|+++++++ | 14% ~16s
|++++++++ | 15% ~16s
|++++++++ | 16% ~16s
|+++++++++ | 17% ~16s
|+++++++++ | 18% ~16s
|++++++++++ | 19% ~15s
|++++++++++ | 20% ~15s
|+++++++++++ | 21% ~15s
|+++++++++++ | 22% ~15s
|++++++++++++ | 23% ~15s
|++++++++++++ | 24% ~14s
|+++++++++++++ | 25% ~14s
|++++++++++++++ | 26% ~14s
|++++++++++++++ | 27% ~14s
|+++++++++++++++ | 28% ~14s
|+++++++++++++++ | 29% ~13s
|++++++++++++++++ | 30% ~13s
|++++++++++++++++ | 31% ~13s
|+++++++++++++++++ | 32% ~13s
|+++++++++++++++++ | 33% ~13s
|++++++++++++++++++ | 34% ~13s
|++++++++++++++++++ | 35% ~12s
|+++++++++++++++++++ | 36% ~12s
|+++++++++++++++++++ | 38% ~12s
|++++++++++++++++++++ | 39% ~12s
|++++++++++++++++++++ | 40% ~12s
|+++++++++++++++++++++ | 41% ~11s
|+++++++++++++++++++++ | 42% ~11s
|++++++++++++++++++++++ | 43% ~11s
|++++++++++++++++++++++ | 44% ~11s
|+++++++++++++++++++++++ | 45% ~11s
|+++++++++++++++++++++++ | 46% ~10s
|++++++++++++++++++++++++ | 47% ~10s
|++++++++++++++++++++++++ | 48% ~10s
|+++++++++++++++++++++++++ | 49% ~10s
|+++++++++++++++++++++++++ | 50% ~10s
|++++++++++++++++++++++++++ | 51% ~09s
|+++++++++++++++++++++++++++ | 52% ~09s
|+++++++++++++++++++++++++++ | 53% ~09s
|++++++++++++++++++++++++++++ | 54% ~09s
|++++++++++++++++++++++++++++ | 55% ~09s
|+++++++++++++++++++++++++++++ | 56% ~08s
|+++++++++++++++++++++++++++++ | 57% ~08s
|++++++++++++++++++++++++++++++ | 58% ~08s
|++++++++++++++++++++++++++++++ | 59% ~08s
|+++++++++++++++++++++++++++++++ | 60% ~08s
|+++++++++++++++++++++++++++++++ | 61% ~07s
|++++++++++++++++++++++++++++++++ | 62% ~07s
|++++++++++++++++++++++++++++++++ | 64% ~07s
|+++++++++++++++++++++++++++++++++ | 65% ~07s
|+++++++++++++++++++++++++++++++++ | 66% ~07s
|++++++++++++++++++++++++++++++++++ | 67% ~06s
|++++++++++++++++++++++++++++++++++ | 68% ~06s
|+++++++++++++++++++++++++++++++++++ | 69% ~06s
|+++++++++++++++++++++++++++++++++++ | 70% ~06s
|++++++++++++++++++++++++++++++++++++ | 71% ~06s
|++++++++++++++++++++++++++++++++++++ | 72% ~05s
|+++++++++++++++++++++++++++++++++++++ | 73% ~05s
|+++++++++++++++++++++++++++++++++++++ | 74% ~05s
|++++++++++++++++++++++++++++++++++++++ | 75% ~05s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~05s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~04s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~04s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~04s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~04s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~04s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~03s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~03s
|+++++++++++++++++++++++++++++++++++++++++++ | 84% ~03s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~03s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~03s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=19s
Calculating cluster 4
| | 0 % ~calculating
|+ | 1 % ~06s
|++ | 2 % ~06s
|++ | 3 % ~06s
|+++ | 4 % ~06s
|+++ | 5 % ~06s
|++++ | 6 % ~06s
|++++ | 7 % ~06s
|+++++ | 8 % ~06s
|+++++ | 9 % ~06s
|++++++ | 10% ~05s
|++++++ | 11% ~05s
|+++++++ | 12% ~05s
|+++++++ | 14% ~05s
|++++++++ | 15% ~05s
|++++++++ | 16% ~05s
|+++++++++ | 17% ~05s
|+++++++++ | 18% ~05s
|++++++++++ | 19% ~05s
|++++++++++ | 20% ~05s
|+++++++++++ | 21% ~05s
|+++++++++++ | 22% ~05s
|++++++++++++ | 23% ~05s
|++++++++++++ | 24% ~05s
|+++++++++++++ | 25% ~05s
|++++++++++++++ | 26% ~05s
|++++++++++++++ | 27% ~04s
|+++++++++++++++ | 28% ~04s
|+++++++++++++++ | 29% ~04s
|++++++++++++++++ | 30% ~04s
|++++++++++++++++ | 31% ~04s
|+++++++++++++++++ | 32% ~04s
|+++++++++++++++++ | 33% ~04s
|++++++++++++++++++ | 34% ~04s
|++++++++++++++++++ | 35% ~04s
|+++++++++++++++++++ | 36% ~04s
|+++++++++++++++++++ | 38% ~04s
|++++++++++++++++++++ | 39% ~04s
|++++++++++++++++++++ | 40% ~04s
|+++++++++++++++++++++ | 41% ~04s
|+++++++++++++++++++++ | 42% ~04s
|++++++++++++++++++++++ | 43% ~04s
|++++++++++++++++++++++ | 44% ~03s
|+++++++++++++++++++++++ | 45% ~03s
|+++++++++++++++++++++++ | 46% ~03s
|++++++++++++++++++++++++ | 47% ~03s
|++++++++++++++++++++++++ | 48% ~03s
|+++++++++++++++++++++++++ | 49% ~03s
|+++++++++++++++++++++++++ | 50% ~03s
|++++++++++++++++++++++++++ | 51% ~03s
|+++++++++++++++++++++++++++ | 52% ~03s
|+++++++++++++++++++++++++++ | 53% ~03s
|++++++++++++++++++++++++++++ | 54% ~03s
|++++++++++++++++++++++++++++ | 55% ~03s
|+++++++++++++++++++++++++++++ | 56% ~03s
|+++++++++++++++++++++++++++++ | 57% ~03s
|++++++++++++++++++++++++++++++ | 58% ~03s
|++++++++++++++++++++++++++++++ | 59% ~03s
|+++++++++++++++++++++++++++++++ | 60% ~02s
|+++++++++++++++++++++++++++++++ | 61% ~02s
|++++++++++++++++++++++++++++++++ | 62% ~02s
|++++++++++++++++++++++++++++++++ | 64% ~02s
|+++++++++++++++++++++++++++++++++ | 65% ~02s
|+++++++++++++++++++++++++++++++++ | 66% ~02s
|++++++++++++++++++++++++++++++++++ | 67% ~02s
|++++++++++++++++++++++++++++++++++ | 68% ~02s
|+++++++++++++++++++++++++++++++++++ | 69% ~02s
|+++++++++++++++++++++++++++++++++++ | 70% ~02s
|++++++++++++++++++++++++++++++++++++ | 71% ~02s
|++++++++++++++++++++++++++++++++++++ | 72% ~02s
|+++++++++++++++++++++++++++++++++++++ | 73% ~02s
|+++++++++++++++++++++++++++++++++++++ | 74% ~02s
|++++++++++++++++++++++++++++++++++++++ | 75% ~02s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~01s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~01s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~01s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~01s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~01s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~01s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~01s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 84% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=06s
Calculating cluster 5
| | 0 % ~calculating
|+ | 1 % ~16s
|++ | 2 % ~15s
|++ | 3 % ~14s
|+++ | 4 % ~14s
|+++ | 5 % ~14s
|++++ | 6 % ~14s
|++++ | 7 % ~13s
|+++++ | 8 % ~13s
|+++++ | 9 % ~13s
|++++++ | 10% ~13s
|++++++ | 11% ~13s
|+++++++ | 12% ~13s
|+++++++ | 13% ~12s
|++++++++ | 14% ~12s
|++++++++ | 15% ~12s
|+++++++++ | 16% ~12s
|+++++++++ | 17% ~12s
|++++++++++ | 18% ~12s
|++++++++++ | 19% ~11s
|+++++++++++ | 20% ~11s
|+++++++++++ | 21% ~11s
|++++++++++++ | 22% ~11s
|++++++++++++ | 23% ~11s
|+++++++++++++ | 24% ~11s
|+++++++++++++ | 26% ~11s
|++++++++++++++ | 27% ~10s
|++++++++++++++ | 28% ~10s
|+++++++++++++++ | 29% ~10s
|+++++++++++++++ | 30% ~10s
|++++++++++++++++ | 31% ~10s
|++++++++++++++++ | 32% ~10s
|+++++++++++++++++ | 33% ~10s
|+++++++++++++++++ | 34% ~09s
|++++++++++++++++++ | 35% ~09s
|++++++++++++++++++ | 36% ~09s
|+++++++++++++++++++ | 37% ~09s
|+++++++++++++++++++ | 38% ~09s
|++++++++++++++++++++ | 39% ~09s
|++++++++++++++++++++ | 40% ~09s
|+++++++++++++++++++++ | 41% ~08s
|+++++++++++++++++++++ | 42% ~08s
|++++++++++++++++++++++ | 43% ~08s
|++++++++++++++++++++++ | 44% ~08s
|+++++++++++++++++++++++ | 45% ~08s
|+++++++++++++++++++++++ | 46% ~08s
|++++++++++++++++++++++++ | 47% ~07s
|++++++++++++++++++++++++ | 48% ~07s
|+++++++++++++++++++++++++ | 49% ~07s
|+++++++++++++++++++++++++ | 50% ~07s
|++++++++++++++++++++++++++ | 51% ~07s
|+++++++++++++++++++++++++++ | 52% ~07s
|+++++++++++++++++++++++++++ | 53% ~07s
|++++++++++++++++++++++++++++ | 54% ~06s
|++++++++++++++++++++++++++++ | 55% ~06s
|+++++++++++++++++++++++++++++ | 56% ~06s
|+++++++++++++++++++++++++++++ | 57% ~06s
|++++++++++++++++++++++++++++++ | 58% ~06s
|++++++++++++++++++++++++++++++ | 59% ~06s
|+++++++++++++++++++++++++++++++ | 60% ~06s
|+++++++++++++++++++++++++++++++ | 61% ~05s
|++++++++++++++++++++++++++++++++ | 62% ~05s
|++++++++++++++++++++++++++++++++ | 63% ~05s
|+++++++++++++++++++++++++++++++++ | 64% ~05s
|+++++++++++++++++++++++++++++++++ | 65% ~05s
|++++++++++++++++++++++++++++++++++ | 66% ~05s
|++++++++++++++++++++++++++++++++++ | 67% ~05s
|+++++++++++++++++++++++++++++++++++ | 68% ~04s
|+++++++++++++++++++++++++++++++++++ | 69% ~04s
|++++++++++++++++++++++++++++++++++++ | 70% ~04s
|++++++++++++++++++++++++++++++++++++ | 71% ~04s
|+++++++++++++++++++++++++++++++++++++ | 72% ~04s
|+++++++++++++++++++++++++++++++++++++ | 73% ~04s
|++++++++++++++++++++++++++++++++++++++ | 74% ~04s
|++++++++++++++++++++++++++++++++++++++ | 76% ~03s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~03s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~03s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~03s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~03s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~03s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~03s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~02s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~02s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~02s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~02s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~02s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=14s
Calculating cluster 6
| | 0 % ~calculating
|+ | 1 % ~22s
|++ | 2 % ~21s
|++ | 3 % ~21s
|+++ | 4 % ~21s
|+++ | 5 % ~20s
|++++ | 6 % ~20s
|++++ | 7 % ~20s
|+++++ | 8 % ~19s
|+++++ | 9 % ~19s
|++++++ | 10% ~19s
|++++++ | 11% ~19s
|+++++++ | 12% ~19s
|+++++++ | 13% ~18s
|++++++++ | 14% ~18s
|++++++++ | 15% ~18s
|+++++++++ | 16% ~18s
|+++++++++ | 18% ~18s
|++++++++++ | 19% ~17s
|++++++++++ | 20% ~17s
|+++++++++++ | 21% ~17s
|+++++++++++ | 22% ~17s
|++++++++++++ | 23% ~16s
|++++++++++++ | 24% ~16s
|+++++++++++++ | 25% ~16s
|+++++++++++++ | 26% ~16s
|++++++++++++++ | 27% ~15s
|++++++++++++++ | 28% ~15s
|+++++++++++++++ | 29% ~15s
|+++++++++++++++ | 30% ~15s
|++++++++++++++++ | 31% ~15s
|++++++++++++++++ | 32% ~14s
|+++++++++++++++++ | 33% ~14s
|++++++++++++++++++ | 34% ~14s
|++++++++++++++++++ | 35% ~14s
|+++++++++++++++++++ | 36% ~13s
|+++++++++++++++++++ | 37% ~13s
|++++++++++++++++++++ | 38% ~13s
|++++++++++++++++++++ | 39% ~13s
|+++++++++++++++++++++ | 40% ~13s
|+++++++++++++++++++++ | 41% ~12s
|++++++++++++++++++++++ | 42% ~12s
|++++++++++++++++++++++ | 43% ~12s
|+++++++++++++++++++++++ | 44% ~12s
|+++++++++++++++++++++++ | 45% ~11s
|++++++++++++++++++++++++ | 46% ~11s
|++++++++++++++++++++++++ | 47% ~11s
|+++++++++++++++++++++++++ | 48% ~11s
|+++++++++++++++++++++++++ | 49% ~11s
|++++++++++++++++++++++++++ | 51% ~10s
|++++++++++++++++++++++++++ | 52% ~10s
|+++++++++++++++++++++++++++ | 53% ~10s
|+++++++++++++++++++++++++++ | 54% ~10s
|++++++++++++++++++++++++++++ | 55% ~10s
|++++++++++++++++++++++++++++ | 56% ~09s
|+++++++++++++++++++++++++++++ | 57% ~09s
|+++++++++++++++++++++++++++++ | 58% ~09s
|++++++++++++++++++++++++++++++ | 59% ~09s
|++++++++++++++++++++++++++++++ | 60% ~08s
|+++++++++++++++++++++++++++++++ | 61% ~08s
|+++++++++++++++++++++++++++++++ | 62% ~08s
|++++++++++++++++++++++++++++++++ | 63% ~08s
|++++++++++++++++++++++++++++++++ | 64% ~08s
|+++++++++++++++++++++++++++++++++ | 65% ~07s
|+++++++++++++++++++++++++++++++++ | 66% ~07s
|++++++++++++++++++++++++++++++++++ | 67% ~07s
|+++++++++++++++++++++++++++++++++++ | 68% ~07s
|+++++++++++++++++++++++++++++++++++ | 69% ~06s
|++++++++++++++++++++++++++++++++++++ | 70% ~06s
|++++++++++++++++++++++++++++++++++++ | 71% ~06s
|+++++++++++++++++++++++++++++++++++++ | 72% ~06s
|+++++++++++++++++++++++++++++++++++++ | 73% ~06s
|++++++++++++++++++++++++++++++++++++++ | 74% ~05s
|++++++++++++++++++++++++++++++++++++++ | 75% ~05s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~05s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~05s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~05s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~04s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~04s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~04s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~04s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~03s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~03s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~03s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~03s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~03s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=21s
Calculating cluster 7
| | 0 % ~calculating
|+ | 1 % ~14s
|++ | 2 % ~13s
|++ | 3 % ~13s
|+++ | 4 % ~12s
|+++ | 5 % ~12s
|++++ | 7 % ~12s
|++++ | 8 % ~11s
|+++++ | 9 % ~11s
|+++++ | 10% ~11s
|++++++ | 11% ~11s
|+++++++ | 12% ~11s
|+++++++ | 13% ~11s
|++++++++ | 14% ~10s
|++++++++ | 15% ~10s
|+++++++++ | 16% ~10s
|+++++++++ | 18% ~10s
|++++++++++ | 19% ~10s
|++++++++++ | 20% ~10s
|+++++++++++ | 21% ~10s
|+++++++++++ | 22% ~10s
|++++++++++++ | 23% ~09s
|+++++++++++++ | 24% ~09s
|+++++++++++++ | 25% ~09s
|++++++++++++++ | 26% ~09s
|++++++++++++++ | 27% ~09s
|+++++++++++++++ | 29% ~09s
|+++++++++++++++ | 30% ~09s
|++++++++++++++++ | 31% ~09s
|++++++++++++++++ | 32% ~08s
|+++++++++++++++++ | 33% ~08s
|++++++++++++++++++ | 34% ~08s
|++++++++++++++++++ | 35% ~08s
|+++++++++++++++++++ | 36% ~08s
|+++++++++++++++++++ | 37% ~08s
|++++++++++++++++++++ | 38% ~08s
|++++++++++++++++++++ | 40% ~08s
|+++++++++++++++++++++ | 41% ~07s
|+++++++++++++++++++++ | 42% ~07s
|++++++++++++++++++++++ | 43% ~07s
|++++++++++++++++++++++ | 44% ~07s
|+++++++++++++++++++++++ | 45% ~07s
|++++++++++++++++++++++++ | 46% ~07s
|++++++++++++++++++++++++ | 47% ~07s
|+++++++++++++++++++++++++ | 48% ~06s
|+++++++++++++++++++++++++ | 49% ~06s
|++++++++++++++++++++++++++ | 51% ~06s
|++++++++++++++++++++++++++ | 52% ~06s
|+++++++++++++++++++++++++++ | 53% ~06s
|+++++++++++++++++++++++++++ | 54% ~06s
|++++++++++++++++++++++++++++ | 55% ~06s
|+++++++++++++++++++++++++++++ | 56% ~05s
|+++++++++++++++++++++++++++++ | 57% ~05s
|++++++++++++++++++++++++++++++ | 58% ~05s
|++++++++++++++++++++++++++++++ | 59% ~05s
|+++++++++++++++++++++++++++++++ | 60% ~05s
|+++++++++++++++++++++++++++++++ | 62% ~05s
|++++++++++++++++++++++++++++++++ | 63% ~05s
|++++++++++++++++++++++++++++++++ | 64% ~04s
|+++++++++++++++++++++++++++++++++ | 65% ~04s
|+++++++++++++++++++++++++++++++++ | 66% ~04s
|++++++++++++++++++++++++++++++++++ | 67% ~04s
|+++++++++++++++++++++++++++++++++++ | 68% ~04s
|+++++++++++++++++++++++++++++++++++ | 69% ~04s
|++++++++++++++++++++++++++++++++++++ | 70% ~04s
|++++++++++++++++++++++++++++++++++++ | 71% ~04s
|+++++++++++++++++++++++++++++++++++++ | 73% ~03s
|+++++++++++++++++++++++++++++++++++++ | 74% ~03s
|++++++++++++++++++++++++++++++++++++++ | 75% ~03s
|++++++++++++++++++++++++++++++++++++++ | 76% ~03s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~03s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~03s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~03s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~02s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~02s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~02s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~02s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~02s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~02s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~02s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=12s
Calculating cluster 8
| | 0 % ~calculating
|+ | 1 % ~10s
|++ | 2 % ~10s
|++ | 3 % ~09s
|+++ | 4 % ~09s
|+++ | 5 % ~09s
|++++ | 6 % ~09s
|++++ | 7 % ~09s
|+++++ | 9 % ~09s
|+++++ | 10% ~09s
|++++++ | 11% ~09s
|++++++ | 12% ~08s
|+++++++ | 13% ~08s
|+++++++ | 14% ~08s
|++++++++ | 15% ~08s
|++++++++ | 16% ~08s
|+++++++++ | 17% ~08s
|++++++++++ | 18% ~08s
|++++++++++ | 19% ~08s
|+++++++++++ | 20% ~08s
|+++++++++++ | 21% ~08s
|++++++++++++ | 22% ~07s
|++++++++++++ | 23% ~07s
|+++++++++++++ | 24% ~07s
|+++++++++++++ | 26% ~07s
|++++++++++++++ | 27% ~07s
|++++++++++++++ | 28% ~07s
|+++++++++++++++ | 29% ~07s
|+++++++++++++++ | 30% ~07s
|++++++++++++++++ | 31% ~07s
|++++++++++++++++ | 32% ~06s
|+++++++++++++++++ | 33% ~06s
|++++++++++++++++++ | 34% ~06s
|++++++++++++++++++ | 35% ~06s
|+++++++++++++++++++ | 36% ~06s
|+++++++++++++++++++ | 37% ~06s
|++++++++++++++++++++ | 38% ~06s
|++++++++++++++++++++ | 39% ~06s
|+++++++++++++++++++++ | 40% ~06s
|+++++++++++++++++++++ | 41% ~05s
|++++++++++++++++++++++ | 43% ~05s
|++++++++++++++++++++++ | 44% ~05s
|+++++++++++++++++++++++ | 45% ~05s
|+++++++++++++++++++++++ | 46% ~05s
|++++++++++++++++++++++++ | 47% ~05s
|++++++++++++++++++++++++ | 48% ~05s
|+++++++++++++++++++++++++ | 49% ~05s
|+++++++++++++++++++++++++ | 50% ~05s
|++++++++++++++++++++++++++ | 51% ~05s
|+++++++++++++++++++++++++++ | 52% ~04s
|+++++++++++++++++++++++++++ | 53% ~04s
|++++++++++++++++++++++++++++ | 54% ~04s
|++++++++++++++++++++++++++++ | 55% ~04s
|+++++++++++++++++++++++++++++ | 56% ~04s
|+++++++++++++++++++++++++++++ | 57% ~04s
|++++++++++++++++++++++++++++++ | 59% ~04s
|++++++++++++++++++++++++++++++ | 60% ~04s
|+++++++++++++++++++++++++++++++ | 61% ~04s
|+++++++++++++++++++++++++++++++ | 62% ~04s
|++++++++++++++++++++++++++++++++ | 63% ~03s
|++++++++++++++++++++++++++++++++ | 64% ~03s
|+++++++++++++++++++++++++++++++++ | 65% ~03s
|+++++++++++++++++++++++++++++++++ | 66% ~03s
|++++++++++++++++++++++++++++++++++ | 67% ~03s
|+++++++++++++++++++++++++++++++++++ | 68% ~03s
|+++++++++++++++++++++++++++++++++++ | 69% ~03s
|++++++++++++++++++++++++++++++++++++ | 70% ~03s
|++++++++++++++++++++++++++++++++++++ | 71% ~03s
|+++++++++++++++++++++++++++++++++++++ | 72% ~03s
|+++++++++++++++++++++++++++++++++++++ | 73% ~02s
|++++++++++++++++++++++++++++++++++++++ | 74% ~02s
|++++++++++++++++++++++++++++++++++++++ | 76% ~02s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~02s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~02s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~02s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~02s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~02s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~02s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~02s
|+++++++++++++++++++++++++++++++++++++++++++ | 84% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=09s
Calculating cluster 9
| | 0 % ~calculating
|+ | 1 % ~18s
|+ | 2 % ~17s
|++ | 3 % ~16s
|++ | 4 % ~16s
|+++ | 5 % ~16s
|+++ | 6 % ~16s
|++++ | 7 % ~16s
|++++ | 8 % ~15s
|+++++ | 9 % ~15s
|+++++ | 10% ~15s
|++++++ | 11% ~15s
|++++++ | 12% ~15s
|+++++++ | 13% ~15s
|+++++++ | 14% ~14s
|++++++++ | 15% ~14s
|++++++++ | 16% ~14s
|+++++++++ | 17% ~14s
|+++++++++ | 18% ~14s
|++++++++++ | 19% ~13s
|++++++++++ | 20% ~13s
|+++++++++++ | 21% ~13s
|+++++++++++ | 22% ~13s
|++++++++++++ | 23% ~13s
|++++++++++++ | 24% ~13s
|+++++++++++++ | 25% ~12s
|+++++++++++++ | 26% ~12s
|++++++++++++++ | 27% ~12s
|++++++++++++++ | 28% ~12s
|+++++++++++++++ | 29% ~12s
|+++++++++++++++ | 30% ~12s
|++++++++++++++++ | 31% ~11s
|++++++++++++++++ | 32% ~11s
|+++++++++++++++++ | 33% ~11s
|+++++++++++++++++ | 34% ~11s
|++++++++++++++++++ | 35% ~11s
|++++++++++++++++++ | 36% ~11s
|+++++++++++++++++++ | 37% ~10s
|+++++++++++++++++++ | 38% ~10s
|++++++++++++++++++++ | 39% ~10s
|++++++++++++++++++++ | 40% ~10s
|+++++++++++++++++++++ | 41% ~10s
|+++++++++++++++++++++ | 42% ~10s
|++++++++++++++++++++++ | 43% ~09s
|++++++++++++++++++++++ | 44% ~09s
|+++++++++++++++++++++++ | 45% ~09s
|+++++++++++++++++++++++ | 46% ~09s
|++++++++++++++++++++++++ | 47% ~09s
|++++++++++++++++++++++++ | 48% ~09s
|+++++++++++++++++++++++++ | 49% ~08s
|+++++++++++++++++++++++++ | 50% ~08s
|++++++++++++++++++++++++++ | 51% ~08s
|++++++++++++++++++++++++++ | 52% ~08s
|+++++++++++++++++++++++++++ | 53% ~08s
|+++++++++++++++++++++++++++ | 54% ~08s
|++++++++++++++++++++++++++++ | 55% ~07s
|++++++++++++++++++++++++++++ | 56% ~07s
|+++++++++++++++++++++++++++++ | 57% ~07s
|+++++++++++++++++++++++++++++ | 58% ~07s
|++++++++++++++++++++++++++++++ | 59% ~07s
|++++++++++++++++++++++++++++++ | 60% ~07s
|+++++++++++++++++++++++++++++++ | 61% ~06s
|+++++++++++++++++++++++++++++++ | 62% ~06s
|++++++++++++++++++++++++++++++++ | 63% ~06s
|++++++++++++++++++++++++++++++++ | 64% ~06s
|+++++++++++++++++++++++++++++++++ | 65% ~06s
|+++++++++++++++++++++++++++++++++ | 66% ~06s
|++++++++++++++++++++++++++++++++++ | 67% ~05s
|++++++++++++++++++++++++++++++++++ | 68% ~05s
|+++++++++++++++++++++++++++++++++++ | 69% ~05s
|+++++++++++++++++++++++++++++++++++ | 70% ~05s
|++++++++++++++++++++++++++++++++++++ | 71% ~05s
|++++++++++++++++++++++++++++++++++++ | 72% ~05s
|+++++++++++++++++++++++++++++++++++++ | 73% ~04s
|+++++++++++++++++++++++++++++++++++++ | 74% ~04s
|++++++++++++++++++++++++++++++++++++++ | 75% ~04s
|++++++++++++++++++++++++++++++++++++++ | 76% ~04s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~04s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~04s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~04s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~03s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~03s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~03s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~03s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~03s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~03s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~02s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~02s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=17s
Calculating cluster 10
| | 0 % ~calculating
|+ | 1 % ~20s
|++ | 2 % ~20s
|++ | 3 % ~19s
|+++ | 4 % ~19s
|+++ | 5 % ~19s
|++++ | 6 % ~18s
|++++ | 7 % ~18s
|+++++ | 8 % ~18s
|+++++ | 9 % ~18s
|++++++ | 10% ~17s
|++++++ | 11% ~17s
|+++++++ | 12% ~17s
|+++++++ | 13% ~17s
|++++++++ | 14% ~17s
|++++++++ | 15% ~16s
|+++++++++ | 16% ~16s
|+++++++++ | 18% ~16s
|++++++++++ | 19% ~16s
|++++++++++ | 20% ~16s
|+++++++++++ | 21% ~15s
|+++++++++++ | 22% ~15s
|++++++++++++ | 23% ~15s
|++++++++++++ | 24% ~15s
|+++++++++++++ | 25% ~15s
|+++++++++++++ | 26% ~14s
|++++++++++++++ | 27% ~14s
|++++++++++++++ | 28% ~14s
|+++++++++++++++ | 29% ~14s
|+++++++++++++++ | 30% ~14s
|++++++++++++++++ | 31% ~13s
|++++++++++++++++ | 32% ~13s
|+++++++++++++++++ | 33% ~13s
|++++++++++++++++++ | 34% ~13s
|++++++++++++++++++ | 35% ~13s
|+++++++++++++++++++ | 36% ~12s
|+++++++++++++++++++ | 37% ~12s
|++++++++++++++++++++ | 38% ~12s
|++++++++++++++++++++ | 39% ~12s
|+++++++++++++++++++++ | 40% ~12s
|+++++++++++++++++++++ | 41% ~11s
|++++++++++++++++++++++ | 42% ~11s
|++++++++++++++++++++++ | 43% ~11s
|+++++++++++++++++++++++ | 44% ~11s
|+++++++++++++++++++++++ | 45% ~11s
|++++++++++++++++++++++++ | 46% ~10s
|++++++++++++++++++++++++ | 47% ~10s
|+++++++++++++++++++++++++ | 48% ~10s
|+++++++++++++++++++++++++ | 49% ~10s
|++++++++++++++++++++++++++ | 51% ~10s
|++++++++++++++++++++++++++ | 52% ~09s
|+++++++++++++++++++++++++++ | 53% ~09s
|+++++++++++++++++++++++++++ | 54% ~09s
|++++++++++++++++++++++++++++ | 55% ~09s
|++++++++++++++++++++++++++++ | 56% ~09s
|+++++++++++++++++++++++++++++ | 57% ~08s
|+++++++++++++++++++++++++++++ | 58% ~08s
|++++++++++++++++++++++++++++++ | 59% ~08s
|++++++++++++++++++++++++++++++ | 60% ~08s
|+++++++++++++++++++++++++++++++ | 61% ~08s
|+++++++++++++++++++++++++++++++ | 62% ~07s
|++++++++++++++++++++++++++++++++ | 63% ~07s
|++++++++++++++++++++++++++++++++ | 64% ~07s
|+++++++++++++++++++++++++++++++++ | 65% ~07s
|+++++++++++++++++++++++++++++++++ | 66% ~07s
|++++++++++++++++++++++++++++++++++ | 67% ~06s
|+++++++++++++++++++++++++++++++++++ | 68% ~06s
|+++++++++++++++++++++++++++++++++++ | 69% ~06s
|++++++++++++++++++++++++++++++++++++ | 70% ~06s
|++++++++++++++++++++++++++++++++++++ | 71% ~06s
|+++++++++++++++++++++++++++++++++++++ | 72% ~05s
|+++++++++++++++++++++++++++++++++++++ | 73% ~05s
|++++++++++++++++++++++++++++++++++++++ | 74% ~05s
|++++++++++++++++++++++++++++++++++++++ | 75% ~05s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~05s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~04s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~04s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~04s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~04s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~04s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~03s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~03s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~03s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~03s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~03s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=19s
Calculating cluster 11
| | 0 % ~calculating
|+ | 1 % ~09s
|++ | 2 % ~09s
|++ | 3 % ~08s
|+++ | 5 % ~08s
|+++ | 6 % ~08s
|++++ | 7 % ~07s
|++++ | 8 % ~07s
|+++++ | 9 % ~07s
|++++++ | 10% ~07s
|++++++ | 11% ~07s
|+++++++ | 12% ~07s
|+++++++ | 14% ~07s
|++++++++ | 15% ~07s
|++++++++ | 16% ~07s
|+++++++++ | 17% ~06s
|++++++++++ | 18% ~06s
|++++++++++ | 19% ~06s
|+++++++++++ | 20% ~06s
|+++++++++++ | 22% ~06s
|++++++++++++ | 23% ~06s
|++++++++++++ | 24% ~06s
|+++++++++++++ | 25% ~06s
|++++++++++++++ | 26% ~06s
|++++++++++++++ | 27% ~06s
|+++++++++++++++ | 28% ~06s
|+++++++++++++++ | 30% ~05s
|++++++++++++++++ | 31% ~05s
|++++++++++++++++ | 32% ~05s
|+++++++++++++++++ | 33% ~05s
|++++++++++++++++++ | 34% ~05s
|++++++++++++++++++ | 35% ~05s
|+++++++++++++++++++ | 36% ~05s
|+++++++++++++++++++ | 38% ~05s
|++++++++++++++++++++ | 39% ~05s
|++++++++++++++++++++ | 40% ~05s
|+++++++++++++++++++++ | 41% ~05s
|++++++++++++++++++++++ | 42% ~04s
|++++++++++++++++++++++ | 43% ~04s
|+++++++++++++++++++++++ | 44% ~04s
|+++++++++++++++++++++++ | 45% ~04s
|++++++++++++++++++++++++ | 47% ~04s
|++++++++++++++++++++++++ | 48% ~04s
|+++++++++++++++++++++++++ | 49% ~04s
|+++++++++++++++++++++++++ | 50% ~04s
|++++++++++++++++++++++++++ | 51% ~04s
|+++++++++++++++++++++++++++ | 52% ~04s
|+++++++++++++++++++++++++++ | 53% ~04s
|++++++++++++++++++++++++++++ | 55% ~03s
|++++++++++++++++++++++++++++ | 56% ~03s
|+++++++++++++++++++++++++++++ | 57% ~03s
|+++++++++++++++++++++++++++++ | 58% ~03s
|++++++++++++++++++++++++++++++ | 59% ~03s
|+++++++++++++++++++++++++++++++ | 60% ~03s
|+++++++++++++++++++++++++++++++ | 61% ~03s
|++++++++++++++++++++++++++++++++ | 62% ~03s
|++++++++++++++++++++++++++++++++ | 64% ~03s
|+++++++++++++++++++++++++++++++++ | 65% ~03s
|+++++++++++++++++++++++++++++++++ | 66% ~03s
|++++++++++++++++++++++++++++++++++ | 67% ~03s
|+++++++++++++++++++++++++++++++++++ | 68% ~02s
|+++++++++++++++++++++++++++++++++++ | 69% ~02s
|++++++++++++++++++++++++++++++++++++ | 70% ~02s
|++++++++++++++++++++++++++++++++++++ | 72% ~02s
|+++++++++++++++++++++++++++++++++++++ | 73% ~02s
|+++++++++++++++++++++++++++++++++++++ | 74% ~02s
|++++++++++++++++++++++++++++++++++++++ | 75% ~02s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~02s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~02s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~02s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~02s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~01s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~01s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 84% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s
Calculating cluster 12
| | 0 % ~calculating
|+ | 1 % ~14s
|++ | 2 % ~13s
|++ | 3 % ~13s
|+++ | 4 % ~13s
|+++ | 5 % ~13s
|++++ | 6 % ~13s
|++++ | 7 % ~13s
|+++++ | 9 % ~12s
|+++++ | 10% ~12s
|++++++ | 11% ~12s
|++++++ | 12% ~12s
|+++++++ | 13% ~12s
|+++++++ | 14% ~12s
|++++++++ | 15% ~11s
|++++++++ | 16% ~11s
|+++++++++ | 17% ~11s
|++++++++++ | 18% ~11s
|++++++++++ | 19% ~11s
|+++++++++++ | 20% ~11s
|+++++++++++ | 21% ~11s
|++++++++++++ | 22% ~10s
|++++++++++++ | 23% ~10s
|+++++++++++++ | 24% ~10s
|+++++++++++++ | 26% ~10s
|++++++++++++++ | 27% ~10s
|++++++++++++++ | 28% ~10s
|+++++++++++++++ | 29% ~10s
|+++++++++++++++ | 30% ~09s
|++++++++++++++++ | 31% ~09s
|++++++++++++++++ | 32% ~09s
|+++++++++++++++++ | 33% ~09s
|++++++++++++++++++ | 34% ~09s
|++++++++++++++++++ | 35% ~09s
|+++++++++++++++++++ | 36% ~09s
|+++++++++++++++++++ | 37% ~08s
|++++++++++++++++++++ | 38% ~08s
|++++++++++++++++++++ | 39% ~08s
|+++++++++++++++++++++ | 40% ~08s
|+++++++++++++++++++++ | 41% ~08s
|++++++++++++++++++++++ | 43% ~08s
|++++++++++++++++++++++ | 44% ~08s
|+++++++++++++++++++++++ | 45% ~07s
|+++++++++++++++++++++++ | 46% ~07s
|++++++++++++++++++++++++ | 47% ~07s
|++++++++++++++++++++++++ | 48% ~07s
|+++++++++++++++++++++++++ | 49% ~07s
|+++++++++++++++++++++++++ | 50% ~07s
|++++++++++++++++++++++++++ | 51% ~07s
|+++++++++++++++++++++++++++ | 52% ~06s
|+++++++++++++++++++++++++++ | 53% ~06s
|++++++++++++++++++++++++++++ | 54% ~07s
|++++++++++++++++++++++++++++ | 55% ~07s
|+++++++++++++++++++++++++++++ | 56% ~06s
|+++++++++++++++++++++++++++++ | 57% ~06s
|++++++++++++++++++++++++++++++ | 59% ~06s
|++++++++++++++++++++++++++++++ | 60% ~06s
|+++++++++++++++++++++++++++++++ | 61% ~06s
|+++++++++++++++++++++++++++++++ | 62% ~06s
|++++++++++++++++++++++++++++++++ | 63% ~05s
|++++++++++++++++++++++++++++++++ | 64% ~05s
|+++++++++++++++++++++++++++++++++ | 65% ~05s
|+++++++++++++++++++++++++++++++++ | 66% ~05s
|++++++++++++++++++++++++++++++++++ | 67% ~05s
|+++++++++++++++++++++++++++++++++++ | 68% ~05s
|+++++++++++++++++++++++++++++++++++ | 69% ~04s
|++++++++++++++++++++++++++++++++++++ | 70% ~04s
|++++++++++++++++++++++++++++++++++++ | 71% ~04s
|+++++++++++++++++++++++++++++++++++++ | 72% ~04s
|+++++++++++++++++++++++++++++++++++++ | 73% ~04s
|++++++++++++++++++++++++++++++++++++++ | 74% ~04s
|++++++++++++++++++++++++++++++++++++++ | 76% ~03s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~03s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~03s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~03s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~03s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~03s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~03s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~02s
|+++++++++++++++++++++++++++++++++++++++++++ | 84% ~02s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~02s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~02s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=14s
Calculating cluster 13
| | 0 % ~calculating
|+ | 1 % ~07s
|+ | 2 % ~07s
|++ | 3 % ~07s
|++ | 4 % ~07s
|+++ | 5 % ~07s
|+++ | 6 % ~07s
|++++ | 7 % ~07s
|++++ | 8 % ~07s
|+++++ | 9 % ~07s
|+++++ | 10% ~07s
|++++++ | 11% ~07s
|++++++ | 12% ~07s
|+++++++ | 13% ~06s
|+++++++ | 14% ~06s
|++++++++ | 15% ~06s
|++++++++ | 16% ~06s
|+++++++++ | 17% ~06s
|+++++++++ | 18% ~06s
|++++++++++ | 19% ~06s
|++++++++++ | 20% ~06s
|+++++++++++ | 21% ~06s
|+++++++++++ | 22% ~06s
|++++++++++++ | 23% ~06s
|++++++++++++ | 24% ~06s
|+++++++++++++ | 25% ~05s
|+++++++++++++ | 26% ~05s
|++++++++++++++ | 27% ~05s
|++++++++++++++ | 28% ~05s
|+++++++++++++++ | 29% ~05s
|+++++++++++++++ | 30% ~05s
|++++++++++++++++ | 31% ~05s
|++++++++++++++++ | 32% ~05s
|+++++++++++++++++ | 33% ~05s
|+++++++++++++++++ | 34% ~05s
|++++++++++++++++++ | 35% ~05s
|++++++++++++++++++ | 36% ~05s
|+++++++++++++++++++ | 37% ~05s
|+++++++++++++++++++ | 38% ~05s
|++++++++++++++++++++ | 39% ~05s
|++++++++++++++++++++ | 40% ~04s
|+++++++++++++++++++++ | 41% ~04s
|+++++++++++++++++++++ | 42% ~04s
|++++++++++++++++++++++ | 43% ~04s
|++++++++++++++++++++++ | 44% ~04s
|+++++++++++++++++++++++ | 45% ~04s
|+++++++++++++++++++++++ | 46% ~04s
|++++++++++++++++++++++++ | 47% ~04s
|++++++++++++++++++++++++ | 48% ~04s
|+++++++++++++++++++++++++ | 49% ~04s
|+++++++++++++++++++++++++ | 50% ~04s
|++++++++++++++++++++++++++ | 51% ~04s
|++++++++++++++++++++++++++ | 52% ~04s
|+++++++++++++++++++++++++++ | 53% ~04s
|+++++++++++++++++++++++++++ | 54% ~03s
|++++++++++++++++++++++++++++ | 55% ~03s
|++++++++++++++++++++++++++++ | 56% ~03s
|+++++++++++++++++++++++++++++ | 57% ~03s
|+++++++++++++++++++++++++++++ | 58% ~03s
|++++++++++++++++++++++++++++++ | 59% ~03s
|++++++++++++++++++++++++++++++ | 60% ~03s
|+++++++++++++++++++++++++++++++ | 61% ~03s
|+++++++++++++++++++++++++++++++ | 62% ~03s
|++++++++++++++++++++++++++++++++ | 63% ~03s
|++++++++++++++++++++++++++++++++ | 64% ~03s
|+++++++++++++++++++++++++++++++++ | 65% ~03s
|+++++++++++++++++++++++++++++++++ | 66% ~03s
|++++++++++++++++++++++++++++++++++ | 67% ~02s
|++++++++++++++++++++++++++++++++++ | 68% ~02s
|+++++++++++++++++++++++++++++++++++ | 69% ~02s
|+++++++++++++++++++++++++++++++++++ | 70% ~02s
|++++++++++++++++++++++++++++++++++++ | 71% ~02s
|++++++++++++++++++++++++++++++++++++ | 72% ~02s
|+++++++++++++++++++++++++++++++++++++ | 73% ~02s
|+++++++++++++++++++++++++++++++++++++ | 74% ~02s
|++++++++++++++++++++++++++++++++++++++ | 75% ~02s
|++++++++++++++++++++++++++++++++++++++ | 76% ~02s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~02s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~02s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~02s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~02s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~01s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~01s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~01s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=07s
# optional: save the cluster markers
write.csv(ClusterMarkers,"ClusterMarkers.csv")
See the top cluster markers
Now we can look at the cluster markers for cluster using EnrichR to compare to reference libraries
setEnrichrSite("Enrichr") # Human genes
Connection changed to https://maayanlab.cloud/Enrichr/
Connection is Live!
# list of all the databases
dbs <- listEnrichrDbs()
# this will list the possible libraries
dbs
# select libraries with cell types
db <- c('CellMarker_Augmented_2021','Azimuth_Cell_Types_2021')
Here is a small function to run easily on each cluster and find the cell type library predictions (specific to the libraries I selected)
checkCelltypes <- function(cluster_num = 0){
clusterX <- ClusterMarkers %>% filter(cluster == cluster_num & avg_log2FC > 0.25)
genes <- clusterX$gene
# the cell type libraries
# get the results for each library
clusterX.cell <- enrichr(genes, databases = db)
# visulize the results
print(plotEnrich(clusterX.cell[[1]], showTerms = 20, numChar = 40, y = "Count", orderBy = "P.value", title = 'CellMarker_Augmented_2021'))
print(plotEnrich(clusterX.cell[[2]], showTerms = 20, numChar = 40, y = "Count", orderBy = "P.value", title = 'Azimuth_Cell_Types_2021'))
}
Run the function for each cluster to see if we can identify cell types
cluster0 <- checkCelltypes(cluster_num = 0)
Uploading data to Enrichr... Done.
Querying CellMarker_Augmented_2021... Done.
Querying Azimuth_Cell_Types_2021... Done.
Parsing results... Done.
Cluster 0 is likely immature neurons - possibly both Glutamatergic and gabaergic
cluster1 <- checkCelltypes(cluster_num = 1)
Uploading data to Enrichr... Done.
Querying CellMarker_Augmented_2021... Done.
Querying Azimuth_Cell_Types_2021... Done.
Parsing results... Done.
Cluster 1 is astrocytes
checkCelltypes(cluster_num = 11)
Uploading data to Enrichr... Done.
Querying CellMarker_Augmented_2021... Done.
Querying Azimuth_Cell_Types_2021... Done.
Parsing results... Done.
After we have looked at all the clusters we add manual annotations
# we need to set the identity to rename
Idents(integrated_seurat) <- "integrated_snn_res.1"
# we need to make a vector of the cell type in the same order - in the cluster order
cell_types1 <- c("neurons_immature", "astrocytes_1","glia",
"neurons_mature","OPC","endothelial_1",
"endothelial_2","astrocyte_2","RadialGlia",
"neurons1","neurons_GABA","neurons2","neural_stem","DAneurons")
names(cell_types1) <- levels(integrated_seurat)
integrated_seurat <- RenameIdents(integrated_seurat, cell_types1)
integrated_seurat <- AddMetaData(object=integrated_seurat, metadata=Idents(integrated_seurat), col.name = "CellTypes")
Lets look at the annotations on the UMAP
DimPlot(integrated_seurat, group.by = "CellTypes", label = TRUE)
Automated annotation We require reference data objects for both methods we will use
print("Developing Forebrain")
[1] "Developing Forebrain"
colnames(devforebrain@meta.data)
[1] "orig.ident" "nCount_RNA" "nFeature_RNA" "Sample"
[5] "Level1" "Age" "Clusters" "New"
[9] "Celltypes"
print("Developing cortex")
[1] "Developing cortex"
colnames(devcotex@meta.data)
[1] "orig.ident" "nCount_RNA" "nFeature_RNA" "WGCNAcluster"
[5] "Name" "Age_in_Weeks" "RegionName" "Laminae"
[9] "Area" "Celltypes"
print("Adult midbrain")
[1] "Adult midbrain"
colnames(midbrain@meta.data)
[1] "orig.ident" "nCount_RNA"
[3] "nFeature_RNA" "Cell_Subtype"
[5] "Cell_Type" "disease__ontology_label"
[7] "organ__ontology_label"
Seurat label transfer using find anchors - predicts cell types from a reference Seurat object
scClassify R weighted kNN https://doi.org/10.15252/msb.20199389 https://sydneybiox.github.io/scClassify/articles/scClassify.html
We need to make the reference and query objects into a “dgCMatrix” object
dim(dgCMat_ref)
[1] 60662 5311
dim(dgCMat_query)
[1] 19204 4028
class(dgCMat_ref)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"
class(dgCMat_query)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"
See the original cell type annotations
table(ref_celltypes)
ref_celltypes
Neuroblast RG Glioblast IN EN
638 1097 365 952 1353
OPC Microglia Pre-OPC NPC Endothelial
98 43 211 262 58
Neurons VLMC U
47 97 90
table(query_clusters)
query_clusters
0 1 2 3 4 5 6 7 8 9 10 11 12 13
566 518 438 389 307 280 255 253 227 227 208 192 98 70
length(ref_celltypes)
[1] 5311
length(query_celltypes)
[1] 4028
Run scClassify
scClassify_res <- scClassify(exprsMat_train = dgCMat_ref,
cellTypes_train = ref_celltypes,
exprsMat_test = dgCMat_query,
cellTypes_test = query_clusters,
tree = "HOPACH",
algorithm = "WKNN",
selectFeatures = c("limma"),
similarity = c("pearson"),
returnList = FALSE,
verbose = FALSE)
Warning in asMethod(object) :
sparse->dense coercion: allocating vector of size 2.4 GiB
plotCellTypeTree(cellTypeTree(scClassify_res$trainRes))
Error in h(simpleError(msg, call)) :
error in evaluating the argument 'x' in selecting a method for function 'cellTypeTree': object 'scClassify_res' not found
See the cell type predictions by cluster
table(scClassify_res$testRes$test$pearson_WKNN_limma$predLabelMat,query_clusters)
Error in base::table(...) : all arguments must have the same length
Check another reference set
dgCMat_ref2 <- GetAssayData(ref2)
# get the cell type data
Idents(ref2) <- "Cell_Type"
ref_celltypes2 <- Idents(ref2)
unique(ref_celltypes2)
[1] NaN astro endo mg olig nonda da opc
Levels: NaN astro endo mg olig nonda da opc
# check the object
dim(dgCMat_ref2)
[1] 41625 8000
class(dgCMat_ref2)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"
# predict the cluster cell types from the second reference
scClassify_res <- scClassify(exprsMat_train = dgCMat_ref2,
cellTypes_train = ref_celltypes2,
exprsMat_test = dgCMat_query,
cellTypes_test = query_clusters,
tree = "HOPACH",
algorithm = "WKNN",
selectFeatures = c("limma"),
similarity = c("pearson"),
returnList = FALSE,
verbose = FALSE)
Warning in asMethod(object) :
sparse->dense coercion: allocating vector of size 2.5 GiB
Warning in pf(Fstat, df1 = df1, df2 = df2, lower.tail = FALSE, log.p = TRUE) :
pbeta(*, log.p=TRUE) -> bpser(a=3999, b=37.9985, x=0.492658,...) underflow to -Inf
Warning in collap(data, level, d, dmat, newmed) :
Not enough medoids to use newmed='medsil' in collap() -
using newmed='nn' instead
Warning in pf(Fstat, df1 = df1, df2 = df2, lower.tail = FALSE, log.p = TRUE) :
pbeta(*, log.p=TRUE) -> bpser(a=3999, b=38.7552, x=0.578758,...) underflow to -Inf
Warning: x or y has vectors with zero standard deviation; consider setting use_nan = TRUE to set these values to NaN or use_nan = FALSE to suppress this warning
Sys.time()
[1] "2023-04-21 22:19:08 EDT"
plotCellTypeTree(cellTypeTree(scClassify_res$trainRes))
Warning: Removed 7 rows containing missing values (`geom_text()`).
See the predictions by cluster
table(scClassify_res$testRes$test$pearson_WKNN_limma$predRes,query_clusters)
query_clusters
0 1 2 3 4 5 6 7 8 9 10
astro 5 109 157 0 127 170 63 104 60 0 4
da 51 0 0 13 0 0 2 0 0 17 5
endo 6 0 1 1 13 29 28 59 101 0 10
mg 0 0 0 0 0 0 1 0 0 0 0
NaN_astro_endo_mg_olig_nonda_da_opc 79 148 155 16 91 74 93 69 60 14 47
NaN_olig 0 7 0 0 1 0 0 0 0 0 0
nonda 145 0 0 267 0 0 8 0 0 55 30
nonda_da_opc 226 0 1 83 0 0 25 0 0 135 46
olig 0 2 0 0 1 0 0 0 0 0 0
opc 1 0 3 1 18 0 6 0 0 1 7
query_clusters
11 12 13
astro 1 49 4
da 1 0 8
endo 2 5 4
mg 0 0 0
NaN_astro_endo_mg_olig_nonda_da_opc 40 34 20
NaN_olig 0 0 0
nonda 39 0 4
nonda_da_opc 58 0 21
olig 0 0 0
opc 17 1 0
pred_counts <- table(scClassify_res$testRes$test$pearson_WKNN_limma$predRes,query_clusters)
# see predictions by cluster in a table
top.pred <- as.data.frame(pred_counts %>% group_by(query_clusters) %>% top_n(2, Freq)) %>% arrange(query_clusters, desc(Freq))
top.pred
Add prediction annotations
Adjust annotations - merge clusters or not